package org.example.aaaatest.a3;

import redis.clients.jedis.Jedis;

// 使用示例
public class trylock1 {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379); // 连接 Redis
        DistributedLock lock = new DistributedLock(jedis, "order_lock", 10000);

        try {
            if (lock.tryLock()) {
                System.out.println("获取锁成功，执行业务");
                /*
                下载：分片下载，断点续传，异步消费。
通过发送HTTP GET请求的方式，通过Range头部字段，指定下载的字节范围大小（byte=0-999）。先将文件进行初始化下载，先通过inputStream和outPutStream流的方式，下载文件的前1000字节（10kb）。然后通过请求的头部内容，获取文件的总大小，计算需要的下载线程数，计算线程的开始位置和结束位置，得到每个线程负责下载的特定范围，每个线程下载10M的数据块，创建并开启线程下载，将执行下载任务的线程加到一个futures的集合里，线程添加完成，会定义个计数器，遍历集合，检查每个线程的下载结果，如果每个线程下载状态都是成功，则表示文件下载完成，然后进行CRC64的校验，确保文件的完整性，更新数据库的状态。如果有一个线程下载失败，整个文件都为失败，会将源文件删除，进行三次重试，三次重试都失败，CRC64校验后将数据库状态为下载错误，抛出异常。

文件处理：合并，解压，切割
先根据产品id获取产品的最新版本，再根据产品id和产品的版本，获取当前版本的下载状态，若状态为1，下载完成，先通过ReentrantLock里的trylock获取锁，读取下载目录下文件通过Stream的方式用一个集合收集起来，然后遍历集合，调用文件处理的工具类，这个类主要主要包含文件的合并和解压操作，是通过一个hashmap，key存储遍历文件的父路径，value为该父路径下的所有文件集合，然后将这个文件以字典顺序进行排序，然后以stream流的形式合并为一个新文件，然后将合并后的完整文件进行进行解压操作，解压的位置为当前父路径下，主要也是用流的方式，用到了inputStream的子类TarArchiveInputStream方法，然后再将原始切割文件进行删除。文件合并解压完，会对文件整体进行一个切割操作，通过shall脚本的方式，拼写split 的命令，对文件以1G大小进行切割，切割后的文件命名为produteId.tar_aa等方式进行命名，然后更改该产品该版本的状态为13（切割完成的），然后读取切割后的文件存放路径，将文件名和文件数量进行返回。


中间件：mysql（TDDL），redis（redis stream队列），VipServer，SchedulerX，Nacos（Diamond），OSS
                 */
            } else {
                System.out.println("获取锁失败");
            }
        } finally {
            lock.unlock(); // 确保锁被释放
        }
    }
}
